module ALU
(
	input wire sys_clk,
	input wire sys_rst_n,
	
	input wire [15:0] oprand0,
	input wire [15:0] oprand1,
	input wire [15:0] oprand2,

	inout wire [15:0] ctrl_sig_inner,
	inout wire [15:0] addr_sig_inner,
	inout wire [15:0] data_sig_inner,

	inout wire work_ok_inner
);

add_cell add_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

sub_cell sub_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

multi_cell multi_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

div_cell div_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

mod_cell mod_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

and_cell and_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

or_cell or_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

not_cell not_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

xor_cell xor_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

left_shift_cell left_shift_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

right_shift_cell right_shift_cell_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.oprand0(oprand0),
	.oprand1(oprand1),
	.oprand2(oprand2),
	.ctrl_sig_inner(ctrl_sig_inner),
	.addr_sig_inner(addr_sig_inner),
	.data_sig_inner(data_sig_inner),
	.work_ok_inner(work_ok_inner)
);

endmodule

/*************************************
	本代码文件，用以连接各种运算子功能模块。
ctrl_sig_inner[4]为1，表明本次操作为算术逻辑
运算。addr_sig_inner的值，表明了运算的列别。
具体规划如下：
addr_sig_inner = 0 : add运算
addr_sig_inner = 1 : sub运算
addr_sig_inner = 2 ：multi运算
addr_sig_inner = 3 ：div运算
addr_sig_inner = 4 ：mod运算
addr_sig_inner = 5 ：and运算
addr_sig_inner = 6 ：or运算
addr_sig_inner = 7 ：not运算,也就是按位取反运算
addr_sig_inner = 8 ：xor运算
addr_sig_inner = 9 ：left shift运算
addr_sig_inner = 10 : right shift运算
由于是初学，我暂时将其定为，最多支持64种。
也就是说，从0到63，是本程序所支持的。但是，
只实现其中的0到10号运算。其余的运算，暂不
支持。且暂时不考虑标志寄存器的问题。
*****************************************/


